// Ts描述对象类型要描述对象中的什么?
// 1. 对象类型
// 2. 对象中有哪些属性
// 3. 属性的数据类型是什么

// let test: object // 描述test是对象类型,但是非常的笼统,对象中的属性无法描述
// let test: { name: string; age: number } = { name: 'zs', age: 18 } // 这样可以描述是对象,也可以规定对象中有哪些属性以及属性的数据类型.但是可读性太差

// 定义接口
// 表示只能有name属性和age属性
// interface IPerson {
//   name: string
//   age: number
// }
// 表示name和age必须有,但是sex可选
// interface IPerson {
//   name: string // 必填
//   age: number //必填
//   sex?: string //可选
// }

// 必须有name和age,sex是可选的.其他属性的名称以及其他属性的个数都无法确定了
// interface IPerson {
//   name: string // 必填
//   age: number //必填
//   sex?: string //可选
//   //任意属性(属性名都不知道叫什么)
//   [xxx: string]: string | number | boolean //注意: 任意属性的值的类型必须包含其他属性数据类型
// }
interface IPerson {
  name: string // 必填
  age: number //必填
  sex?: string //可选
  //任意属性(属性名都不知道叫什么)
  [xxx: string]: string | number | boolean //注意: 任意属性的值的类型必须包含其他属性数据类型
  readonly id: string // 这个属性只能被读取,以及可以初始化,但是不能修改. 只读属性也是必须有的
}

let test: IPerson = {
  name: 'zs',
  age: 18,
  sex: '女',
  xxx: 123,
  yyy: 345,
  zzz: 'ahaha',
  aaa: false,
  id: '1231234123',
}

test.id
// test.id = '456'

/*

{
    name:'zs'
    [变量]:123
}


*/
